json.Marshal 忽略 omitempty 的方法

grpc-go 时生成的 pb.go 文件中结构的字段都有 json:",omitempy" 的 tag,例如:

1
2
3
type HelloReply struct {
Message string `protobuf:"bytes,1,opt,name=message" json:"message,omitempty"`
}

在某些情况可能需要将此结构转成 json 输出,并且需要当是零值时不要在 json 串中忽略此字段。
以上面结构为例,默认编码成的 json 串是 {},但需要的是 {"message":""}

开始想到的方法是用 shell 脚本删除 omitempty,但此方法有可能多删除东西,并且不易管理。最后使用的方法是复制了 encoding/json 库的源码到新的库 my_json,修改这一行中的 omitEmptyfalse。当需要忽略 omitempty 时,使用 my_json 库即可。

1
2
3
4
5
6
7
8
fields = append(fields, fillField(field{
name: name,
tag: tagged,
index: index,
typ: ft,
omitEmpty: opts.Contains("omitempty"), // 改为 false
quoted: quoted,
}))